﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AlgoritimoGenetico.ambiente;
using AlgoritimoGenetico.utils;

namespace Simulacoes
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string resultado = string.Empty;//_GerarExperimento1();

            //resultado += _GerarExperimento2();

            //resultado += _GerarExperimento3();

            //resultado += _GerarExperimento5();

            resultado += _GerarExperimento6();

            FDialogcs fResult = new FDialogcs(resultado);
            fResult.ShowDialog(this);

        }
        private string _GerarExperimento1() 
        {
            string resultado = "Experimento 1, sem filtro";
            int numeroVezes = 30;

            List<byte> perfilturista = new List<byte>(25);
            for (int i = 0; i < 25; i++)
                perfilturista.Add(0);

            Ambiente amb = null;


            List<GenericPair<string, float>> resultados = new List<GenericPair<string, float>>(30);
            for (int i = 0; i < numeroVezes; i++)
            { 
                amb = new Ambiente(50, //tamanhoPopulacao
                                   10000, //maximoEpocas
                                   0.85, //taxaCruzamento
                                   0.01, //taxaMutacao
                                   0.5, //TaxaSeleçao
                                   perfilturista, //Perfilturista
                                   new DateTime(2011, 01, 01) //MesRef
                                   );
                resultados.Add(amb.Run());                 
            }

            float Media = 0;

            foreach (GenericPair<string, float> res in resultados)
                Media += res.Second;

            Media = Media / numeroVezes;

            float Desvio = 0;
            for (int i = 0; i < resultados.Count; i++ )
            {
                Desvio += (float)Math.Pow((double)(resultados[i].Second - Media), (double)2.0);
                resultado = string.Concat(resultado,
                                          "\nRota" + (i+1)+ ": " + resultados[i].First,
                                          "\nFitness: " + resultados[i].Second + "\n"
                            );
            }

            Desvio = (float)Math.Sqrt(Desvio / numeroVezes);

           


            resultado = string.Concat(resultado,
                                      "\nMédia: " + Media,
                                      "\nDesvio: " + Desvio
                    );

            return resultado;
        }
        private string _GerarExperimento2()
        {
            string resultado = "\n\nExperimento 2, todos os filtros";
            int numeroVezes = 30;

            List<byte> perfilturista = new List<byte>(25);
            for (int i = 0; i < 25; i++)
                perfilturista.Add(1);

            Ambiente amb = null;


            List<GenericPair<string, float>> resultados = new List<GenericPair<string, float>>(30);
            for (int i = 0; i < numeroVezes; i++)
            {
                amb = new Ambiente(50, //tamanhoPopulacao
                                   10000, //maximoEpocas
                                   0.85, //taxaCruzamento
                                   0.01, //taxaMutacao
                                   0.5, //TaxaSeleçao
                                   perfilturista, //Perfilturista
                                   new DateTime(2011, 01, 01) //MesRef
                                   );
                resultados.Add(amb.Run());
            }

            float Media = 0;

            foreach (GenericPair<string, float> res in resultados)
                Media += res.Second;

            Media = Media / numeroVezes;

            float Desvio = 0;
            for (int i = 0; i < resultados.Count; i++)
            {
                Desvio += (float)Math.Pow((double)(resultados[i].Second - Media), (double)2.0);
                resultado = string.Concat(resultado,
                                          "\nRota" + (i + 1) + ": " + resultados[i].First,
                                          "\nFitness: " + resultados[i].Second + "\n"
                            );
            }

            Desvio = (float)Math.Sqrt(Desvio / numeroVezes);




            resultado = string.Concat(resultado,
                                      "\nMédia: " + Media,
                                      "\nDesvio: " + Desvio
                    );

            return resultado;
        }
        private string _GerarExperimento3()
        {
            string resultado = "\n\nExperimento 3, alguns filtros (metade)";
            int numeroVezes = 30;

            List<byte> perfilturista = new List<byte>(25) { 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0 };
            
            Ambiente amb = null;


            List<GenericPair<string, float>> resultados = new List<GenericPair<string, float>>(30);
            for (int i = 0; i < numeroVezes; i++)
            {
                amb = new Ambiente(50, //tamanhoPopulacao
                                   1000, //maximoEpocas
                                   0.85, //taxaCruzamento
                                   0.01, //taxaMutacao
                                   0.5, //TaxaSeleçao
                                   perfilturista, //Perfilturista
                                   new DateTime(2011, 01, 01) //MesRef
                                   );
                resultados.Add(amb.Run());
            }

            float Media = 0;

            foreach (GenericPair<string, float> res in resultados)
                Media += res.Second;

            Media = Media / numeroVezes;

            float Desvio = 0;
            for (int i = 0; i < resultados.Count; i++)
            {
                Desvio += (float)Math.Pow((double)(resultados[i].Second - Media), (double)2.0);
                resultado = string.Concat(resultado,
                                          "\nRota" + (i + 1) + ": " + resultados[i].First,
                                          "\nFitness: " + resultados[i].Second + "\n"
                            );
            }

            Desvio = (float)Math.Sqrt(Desvio / numeroVezes);




            resultado = string.Concat(resultado,
                                      "\nMédia: " + Media,
                                      "\nDesvio: " + Desvio
                    );

            return resultado;
        }
        private string _GerarExperimento5()
        {
            string resultado = "\n\nExperimento 5, filtros que nenhuma cidade atenda";
            int numeroVezes = 30;

            List<byte> perfilturista = new List<byte>(25) {0,0,1,1,1,0,1,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1};
            
            Ambiente amb = null;


            List<GenericPair<string, float>> resultados = new List<GenericPair<string, float>>(30);
            for (int i = 0; i < numeroVezes; i++)
            {
                amb = new Ambiente(50, //tamanhoPopulacao
                                   10000, //maximoEpocas
                                   0.85, //taxaCruzamento
                                   0.01, //taxaMutacao
                                   0.5, //TaxaSeleçao
                                   perfilturista, //Perfilturista
                                   new DateTime(2011, 01, 01) //MesRef
                                   );
                resultados.Add(amb.Run());
            }

            float Media = 0;

            foreach (GenericPair<string, float> res in resultados)
                Media += res.Second;

            Media = Media / numeroVezes;

            float Desvio = 0;
            for (int i = 0; i < resultados.Count; i++)
            {
                Desvio += (float)Math.Pow((double)(resultados[i].Second - Media), (double)2.0);
                resultado = string.Concat(resultado,
                                          "\nRota" + (i + 1) + ": " + resultados[i].First,
                                          "\nFitness: " + resultados[i].Second + "\n"
                            );
            }

            Desvio = (float)Math.Sqrt(Desvio / numeroVezes);
            resultado = string.Concat(resultado,
                                      "\nMédia: " + Media,
                                      "\nDesvio: " + Desvio
                    );
            return resultado;
        }
        private string _GerarExperimento6()
        {
            string resultado = "\n\nExperimento 6, filtros que pelo menos a maioria ou todas as cidades possuam";
            int numeroVezes = 30;

            List<byte> perfilturista = new List<byte>(25) {1, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0};
            
            Ambiente amb = null;


            List<GenericPair<string, float>> resultados = new List<GenericPair<string, float>>(30);
            for (int i = 0; i < numeroVezes; i++)
            {
                amb = new Ambiente(50, //tamanhoPopulacao
                                   10000, //maximoEpocas
                                   0.85, //taxaCruzamento
                                   0.01, //taxaMutacao
                                   0.5, //TaxaSeleçao
                                   perfilturista, //Perfilturista
                                   new DateTime(2011, 01, 01) //MesRef
                                   );
                resultados.Add(amb.Run());
            }

            float Media = 0;

            foreach (GenericPair<string, float> res in resultados)
                Media += res.Second;

            Media = Media / numeroVezes;

            float Desvio = 0;
            for (int i = 0; i < resultados.Count; i++)
            {
                Desvio += (float)Math.Pow((double)(resultados[i].Second - Media), (double)2.0);
                resultado = string.Concat(resultado,
                                          "\nRota" + (i + 1) + ": " + resultados[i].First,
                                          "\nFitness: " + resultados[i].Second + "\n"
                            );
            }

            Desvio = (float)Math.Sqrt(Desvio / numeroVezes);
            resultado = string.Concat(resultado,
                                      "\nMédia: " + Media,
                                      "\nDesvio: " + Desvio
                    );
            return resultado;
        }
    }
}
